﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
''' <summary>
''' Einfach nur ein Mesh. Die Funktionen um es zu laden und die Malroutine sind ebenfalls dabei.
''' </summary>
''' <remarks></remarks>
Public Class Objekt3D
    Private Shared gelTexturen() As Texture = {}
    Private Shared gelTextureNamen() As String = {}

    Public Shared Spielerfarben() As Color = {}
    Public Shared SpielerFarbe As Color = Color.Fuchsia
    Public Structure strMeshBild
        Public moName As String
        Public moMesh As Microsoft.DirectX.Direct3D.Mesh
        Public mlMeshMaterials As Int32 ' = -1
        Public moMaterials() As Material
        Public moTextures() As String
    End Structure
    Public MeshBild As strMeshBild
    Public Shared Sub TexturLaden(ByVal TexName As String)
        Dim pfadTextures As String = My.Settings.Resourcenpfad + "Landschaften\Bilder\3D\" + My.Settings.TexturQuali + "\"
        Array.Resize(gelTexturen, gelTexturen.Length + 1)
        gelTexturen(gelTexturen.Length - 1) = TextureLoader.FromFile(Grafikengine.Grafikkarte, pfadTextures + "\" + TexName)
        Array.Resize(gelTextureNamen, gelTextureNamen.Length + 1)
        gelTextureNamen(gelTextureNamen.Length - 1) = TexName
    End Sub
    Public Shared Function getTextur(ByVal TexName As String) As Texture
        If TexName Is Nothing Then Return Nothing 'wie kann der erwarten etwas zurückzubekommen, wenn er mir nichts gibt! Unverschämtheit!!

        For i = 0 To gelTextureNamen.Length - 1
            If gelTextureNamen(i).ToLower = TexName.ToLower Then
                Return gelTexturen(i)
            End If
        Next
        Return Nothing
    End Function

    ''' <summary>
    ''' Lädt ein Mesh.
    ''' </summary>
    ''' <param name="Datei">Die komplette Datei, mit Pfad und endung.</param>
    ''' <remarks></remarks>
    Public Overridable Sub MeshBildLaden(ByVal Datei As String)
        If My.Computer.FileSystem.FileExists(Datei) Then
        
            Dim pfad As String = Datei
            Dim mtrlBuffer() As ExtendedMaterial = {}
            MeshBild = New strMeshBild
            With MeshBild
                .moName = Datei.Remove(0, Datei.LastIndexOf("\") + 1).Replace(".x", "")
                .moMesh = Microsoft.DirectX.Direct3D.Mesh.FromFile(Datei, MeshFlags.Managed, Grafikengine.Grafikkarte, mtrlBuffer)
                .mlMeshMaterials = mtrlBuffer.Length
                ReDim .moMaterials(.mlMeshMaterials - 1)
                ReDim .moTextures(.mlMeshMaterials - 1)
                'Jetzt weren die Texturen und Materialien geladen.
                Dim X As Integer
                For X = 0 To mtrlBuffer.Length - 1
                    .moMaterials(X) = mtrlBuffer(X).Material3D
                    .moMaterials(X).Ambient = .moMaterials(X).Diffuse 'because directx sometimes doesnt do this for you
                    If Not mtrlBuffer(X).TextureFilename = "" Then
                        TexturLaden(mtrlBuffer(X).TextureFilename)
                        .moTextures(X) = mtrlBuffer(X).TextureFilename
                    End If
                Next
            End With

        Else
            'tut mir leid, aber wenn es die datei nicht gibt...
            MeshBild = New strMeshBild
            MeshBild.moMesh = Nothing
        End If
    End Sub

    ''' <summary>
    ''' Bei Animationen, muss ein Matrix mitgegeben werden!
    ''' </summary>
    ''' <param name="worldMatrix"></param>
    ''' <remarks></remarks>
    Public Overridable Sub Malen(ByVal worldMatrix As Matrix)
        Malen(worldMatrix, False)
    End Sub
    ''' <summary>
    ''' Bei Animationen, muss ein Matrix mitgegeben werden!
    ''' </summary>
    ''' <remarks></remarks>
    Public Overridable Sub Malen(ByVal worldMatrix As Matrix, ByVal Einfärben As Boolean)
        If MeshBild.moMesh Is Nothing Then Exit Sub
        Grafikengine.Grafikkarte.Transform.World = worldMatrix
        With MeshBild
            For X = 0 To .mlMeshMaterials - 1
                Dim M As Material = .moMaterials(X)
                'My.Settings.TotalEinfärben = False
                ' My.Settings.Save()
                If isSignalFarbe(M.Diffuse) Then
                    M.Emissive = M.Diffuse
                End If
                If My.Settings.TotalEinfärben Or Einfärben Then
                    M.Ambient = SpielerFarbe
                    M.Diffuse = M.Ambient
                Else
                    If M.Ambient = Color.FromArgb(255, 18, 31, 229) Then
                        M.Ambient = SpielerFarbe
                        M.Diffuse = M.Ambient
                    End If
                End If
                Grafikengine.Grafikkarte.Material = M
                'Grafikengine.Grafikkarte.Material = .moMaterials(X)
                Grafikengine.Grafikkarte.SetTexture(0, getTextur(.moTextures(X)))
                .moMesh.DrawSubset(X)
            Next X
        End With
    End Sub

    Function isSignalFarbe(ByVal Farbe As Color) As Boolean
        Dim Ergebnis As Boolean = True 'Beweise mir das gegenteil!
        If Farbe.R < 255 And Farbe.R > 0 Then Ergebnis = False 'mach ich doch glatt!
        If Farbe.G < 255 And Farbe.G > 0 Then Ergebnis = False 'mach ich doch glatt!
        If Farbe.B < 255 And Farbe.B > 0 Then Ergebnis = False 'mach ich doch glatt!
        Return Ergebnis
    End Function
End Class
